import java.util.Stack;

/*
 * @lc app=leetcode.cn id=227 lang=java
 *
 * [227] 基本计算器 II
 */

// @lc code=start
class Solution {
    // 这个不带括号了，我估计明天的题就带括号
    // 常规解法 1.后缀表达式  2.双栈，操作数栈和符号栈
    // 由于这里没有括号，乘除法的优先级高，遇到了就直接计算，那么仅需要记录上一个操作符
    public int calculate(String s) {
        // 保存上一个符号，初始为 +
        char beforeSign = '+';

        // 保存操作数
        Stack<Integer> stk = new Stack<>();

        int res = 0;
        s += '+';//如果最后以数字结尾，那么最后一个数字不好参与运算，在末尾加一个操作符，方便运算
        int len = s.length();
        int num = 0;//num保存当前数字

        for(int i = 0 ;i<len ;i++){
            char cur = s.charAt(i);
            if(Character.isDigit(cur)){//遇到操作数,记录这个操作数
                num = cur-'0'; 
                while(i+1 < len && Character.isDigit(s.charAt(i+1))){
                    num = num*10+s.charAt(++i)-'0';
                }
            }else if(cur != ' '){//一定是符号
                //不等于空格的情况下要看上一个符号是什么来决定
                switch (beforeSign) {
                    case '+':
                        stk.push(num);
                        break;
                    case '-':
                        stk.push(-num);
                        break;
                    case '*':
                        stk.push(stk.pop()*num);
                        break;
                    case '/':
                        stk.push(stk.pop()/num);
                        break;
                    default:
                        break;
                }
                //记录当前符号
                beforeSign = cur;
            }
            
        }

        while(!stk.empty()){
            res += stk.pop();
        }
        return res;
    }
}
// @lc code=end

